package lambdademo;

import java.util.Comparator;
import java.util.PriorityQueue;

//函数式接口
//无返回值无参数
@FunctionalInterface // 被FunctionalInterface修饰的接口只有一个方法
interface NoParameterNoReturn {
    void test();
//    default void test2() {
//
//    }
//    public static void test3() {
//
//    }
}

//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}
//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a,int b);
}
//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();
}

//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}
//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
    int test(int a,int b);
}

public class Test {

    // 有返回值的
    public static void main(String[] args) {
        //NoParameterReturn noParameterReturn = () -> { return 10; };
        NoParameterReturn noParameterReturn = () -> 10;
        int ret = noParameterReturn.test();
        System.out.println(ret);

        OneParameterReturn oneParameterReturn = a -> a;
        ret = oneParameterReturn.test(99);
        System.out.println(ret);

        MoreParameterReturn moreParameterReturn = (a, b) -> a + b;
        ret = moreParameterReturn.test(10, 20);
        System.out.println(ret);
    }

    // 无返回值的
    public static void main2(String[] args) {
//        NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn() {
//            @Override
//            public void test() {
//                System.out.println("frost");
//            }
//        };
//
//        noParameterNoReturn.test();

        //NoParameterNoReturn noParameterNoReturn2 = () -> { System.out.println("frost"); };
        NoParameterNoReturn noParameterNoReturn2 = () -> System.out.println("frost");
        noParameterNoReturn2.test();

        //OneParameterNoReturn oneParameterNoReturn = (a) -> System.out.println(a);
        OneParameterNoReturn oneParameterNoReturn = System.out::println;// 方法的引用
        oneParameterNoReturn.test(10);

        //MoreParameterNoReturn moreParameterNoReturn = (int a, int b) -> { System.out.println(a+b); };
        MoreParameterNoReturn moreParameterNoReturn = (a, b) -> System.out.println(a+b);
        moreParameterNoReturn.test(1, 2);
    }

    public static void main1(String[] args) {
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        // 两个等价的函数实现
        PriorityQueue<Integer> priorityQueue2 = new PriorityQueue<>(((o1, o2) -> o1-o2));
    }
}
